package com.szrt.day20170412.student.dao;

import com.szrt.day20170412.student.entity.StudentEntity;

/**
 * 0
 *	0	        1         2        2         3
 * 贾梦菊		张嘉源	 	罗智壕	何小强		靳志辉
	66        46        56        86        45
	
	
	
	// ?
	已知要删除的学生的数组 ：罗智壕
	已知要删除的学生的数组 ：罗智壕	何小强
	已知要删除的学生的数组: 罗智壕	何小强  候亮平
	已知要删除的学生的数组: 贾梦菊	张嘉源  罗智壕  何小强 靳志辉  林华华
	
	
	public StudentEntity[] deletes(StudentEntity[] origin,StudentEntity[] deleteArray)
	
	把罗智壕的成绩修改成66分
			形参
			1  搜索的范围
			2  被修改人的名字
			3  修改后的成绩
			
			返回值? void boolean StudentEntiy
			
			方法名： updateStudentScore
	
	
	
	把何小强的年龄+1
	
 * 
 * 1:找出哪些人及格
 * 如何设计方法？
 * 	已知：
 * 		对象数组  学生数组  StudentEntity[] students
 * 
 * 	求：返回一个学生的数组
 * 
 * @author scott-13926583118
 * 2017年4月12日
 *
 */
public class StudentDao {
	
	
	/**
	 * 批量删除学生
	 * @param origin      原来的数组
	 * @param deleteArray 要删除的数组
	 * @return
	 */
	public StudentEntity[] deletes(StudentEntity[] origin,
			StudentEntity[] deleteArray){
		
		//1  确定到底要删除多少个(2  要删除的学生在原来的数组中必须存在)
		
		
		int counter=0;
		for(int index =0; index <deleteArray.length; index++ ){
			
			StudentEntity deleteStudent = deleteArray[index];
			
			for(int inner = 0; inner<origin.length;inner++){
				
				StudentEntity originEntity = origin[inner];
				
				//要删除的学生的姓名和原来的原来的姓名是否 一致
				
				if(deleteStudent.getName().equals(originEntity.getName())){
					counter++;
					//必须 可以提高性能  体现你水平
					break;
				}
				
			}
			
		}
		
		
		//可以确定到底要删除多少个  counter  排除一些不符合条件的学生  过滤  null
		StudentEntity[]  del = new  StudentEntity[counter];
		
		counter=0;
		for(int index =0; index <deleteArray.length; index++ ){
			
			StudentEntity deleteStudent = deleteArray[index];
			
			
			for(int inner = 0; inner<origin.length;inner++){
				
				StudentEntity originEntity = origin[inner];
				
				//要删除的学生的姓名和原来的原来的姓名是否 一致
				
				if(deleteStudent.getName().equals(originEntity.getName())){

					//把老数组中具体的学生的所有信息复制过来   姓名  分数 ...
					del[counter] =originEntity;
					counter++;
					//必须 可以提高性能  体现你水平
					break;
				}
				
			}
			
		}
		
		//要返回的数组： 原来的数组的长度- 要删除的数组的长度  null
		StudentEntity[]  jieguo = new  StudentEntity[origin.length-counter];
		
		
		//把要删除的学生全部找到并且  放到 数组 del 罗智壕	何小强
		
		
		int nn=0;
		for(int index =0; index <origin.length; index++){
			StudentEntity org = origin[index];
			
			
			int cc =0;
			
			
			for(int inner =0; inner< del.length; inner++){
				StudentEntity delStu = del[inner];
				if(delStu.getName().equals(org.getName())){
					//不相同 就说明是我们想过要的结果  放到jieguo
					
					cc++;
				}
				
			}
			
			if(cc ==0){
				
				jieguo[nn]=org;
				nn++;
				
			}
		}
		
		
		
		return jieguo;
	}
	
	
	/**
	 * 修改学生的成绩
	 * @param students     搜索的范围
	 * @param studentName  被修改人的名字
	 * @param updateScore  修改后的成绩
	 * @return
	 */
	public  StudentEntity updateStudentScore(StudentEntity[] students,
			String studentName,double updateScore){
		
		//1  罗智豪 有可能不存在   -1/index   
		
		//打桩测试  假设某个条件成立
		int index = findIndex(students, studentName);
		
		
		if(index != -1){
			//2  罗智壕  通过下标去操作这个学生
			
			StudentEntity student=students[index];
			
			//程序的健壮性
			if(updateScore>=0  && updateScore <=100){
				student.setScore(updateScore);
			}
			return student;
			//3 直接修改
		}
		
		
		return null;
	}
	
	
	/**
	 * 返回指定名字的学生的下标  如果没有找到 返回-1
	 * @param students
	 * @param studentName
	 * @return
	 */
	public int findIndex(StudentEntity[] students,String studentName){
		
		int xb=-1;
		for(int index=0; index<students.length;index++){
			
			StudentEntity student = students[index];
			String name = student.getName();
			
			if(studentName.equals(name)){
				//说明有这个人  return 不仅会结束循环 而且会结束这个方法
				return index;
			}
			
		}
		
		System.out.println("aaa");
		
		return xb;
	}
	
	

	/**
	 * 中深软通的标注是考试成绩>=70才及格
	 * 找出哪些人及格>=60
	 * @param students   搜索的范围
	 * @return  
	 */
	public StudentEntity[] findAllNG(StudentEntity[] students){
		
		
		//循环students取得某个确定的学生student  然后拿到学生的成绩score 然后<60比较 
		
		int counter=0;
		for(int index=0; index<students.length;index++){
			
			//学生数组中放的就是学生对象
			StudentEntity studentEntity = students[index];
			double score = studentEntity.getScore();
			if(score<60){
				counter++;
			}
		}
		
		//3
		System.out.println(counter);
		
		//数组的长度? 恰到好处
		StudentEntity[] jieguo = new StudentEntity[counter];
		
		
		//为什么counter清零
		counter=0;
		//1 循环students取得某个确定的学生student  然后拿到学生的成绩score 然后<60满足条件?
		for(int index=0; index<students.length;index++){
			
			//学生数组中放的就是学生对象
			StudentEntity searchStudent = students[index];
			double score = searchStudent.getScore();
			if(score<60){
				//然后<60满足条件
				counter++;
				
				//因为数组的下标从0开始  操作数组中的元素 只有1中方法 就是使用下标
				jieguo[counter-1]=searchStudent;
				
			}
		}
		
		//2 如何把人放进来?
		return jieguo;
		
	}
	
	
	/**
	 * 方法设计的核心思想： 内部的代码尽量符合更多的要求  也就是外面的值可以随便边 但是里面的代码不动
	 * 高内聚  低耦合
	 * 找出哪些人的个位数是6
	 * @param students
	 * @return
	 */
	public StudentEntity[] findWH(StudentEntity[] students,int weihao){
		//循环students取得某个确定的学生student  然后拿到学生的成绩score 然后<60比较 
		
		int counter=0;
		for(int index=0; index<students.length;index++){
			
			//学生数组中放的就是学生对象
			StudentEntity studentEntity = students[index];
			double score = studentEntity.getScore();
			if(score%10==weihao){
				counter++;
			}
		}
		
		//3
		System.out.println(counter);
		
		//数组的长度? 恰到好处
		StudentEntity[] jieguo = new StudentEntity[counter];
		
		
		//为什么counter清零
		counter=0;
		//1 循环students取得某个确定的学生student  然后拿到学生的成绩score 然后<60满足条件?
		for(int index=0; index<students.length;index++){
			
			//学生数组中放的就是学生对象
			StudentEntity searchStudent = students[index];
			double score = searchStudent.getScore();
			if(score%10==weihao){
				//然后<60满足条件
				counter++;
				
				//因为数组的下标从0开始  操作数组中的元素 只有1中方法 就是使用下标
				jieguo[counter-1]=searchStudent;
				
			}
		}
		
		//2 如何把人放进来?
		return jieguo;
		
	}
	
	


}
